
class Vector {
	private String content[];
	private int size, capacity;

	public Vector() {

		size = 0;
		capacity = 1;
		content = new String[1];
	}

	/**
	 * Fügt ein Element am Ende des Vektors an.
	 * Da ein Array immer nur mit einer bestimmen Größe erstellt werden kann,
	 * muss unter umständen das Array erweitert werden. Dies geschieht durch initialisieren
	 * eines neuen (größeren) Arrays. Dann werden die Werte aus dem alten in das neue Array kopiert.
	 * Als letztes wird der Zeiger des Contens noch auf das neue (größere) Array gelegt.
	 * 
	 * Dies führt zu einer wachsenden Laufzeit. Allerdings ist die Laufzeit linear Beschränkt, d.h. Sie 
	 * wächst mit der Größe des Arrays. Das Array muss bei einem add Befehl max. einmal komplett durchlaufen werden.
 	 * @param s 
	 */
	public void add(Object s) {
		
		if (size < capacity) {
			content[size] = (String) s;
			size++;
		} else {
			String tmp[] = new String[2 * capacity];
			for (int i = 0; i < size; i++)
				tmp[i] = content[i];
			tmp[size] = (String) s;
			size++;
			capacity *= 2;
			content = tmp;
		}
	}
	
	/**
	 * Fügt ein Element an der angegebenen Stelle in das Array ein.
	 * 
	 * Auch hier gilt die Laufzeit des Add Befehls. Plus die Laufzeit, die benötigt wird
	 * für das Verschieben der Elemente. Also ist die Laufzeit max. 2n. Wobei n die Länge des Arrays.
	 * @param s
	 * @param index
	 */
	public void insert(Object s, int index)
	{
		if (size == capacity)
		{
			String tmp[] = new String[2 * capacity];
			for (int i = 0; i < size; i++)
				tmp[i] = content[i];
			
			for (int i = index; i < size; i++)
				tmp[i + 1] = content[i];
			
			tmp[index] = (String) s;
			
			size++;
			capacity *= 2;
			content = tmp;
		}
		else
		{
			for (int i = index; i < size; i++)
				content[i + 1] = content[i];
			
			content[index] = (String) s;
			size++;
		}
	}

	/**
	 * Entfernt ein Element an der angegebenen Stelle.
	 * 
	 * Die Laufzeit beträgt hier max. n. Falls das erste Element enfernt wird.
	 * @param index
	 * @return
	 */
	public String remove(int index)
	{
		if (index > size) return null;
		
		String temp = content[index];
		for (int i = index; i < size - 1; i++)
			content[i] = content[i + 1];
		content[size - 1] = null;
		
		size--;
		
		return temp;
	}
	
	/**
	 * Prüft, ob ein Element in dem Array vorhanden ist.
	 * 
	 * Laufzeit ist hier auch n. 
	 * @param obj
	 * @return
	 */
	public boolean contains(Object obj)
	{
		for (int i = 0; i < size; i++)
			if (content[i] == obj) return true;
		return false;
	}

	public String get(int i) {

		return content[i];
	}

	public int size() {

		return size;
	}
}
